package com.atguigu.juc;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

/**
 * @author tongatong
 * @name FutureTaskDemo
 * @description
 * FutureTask作用：
 *   使thread支持callable接口。
 *
 * demo知识点：
 *  1. futuretask自带缓存。
 *  2. futuretask的get()方法，必须放到方法体最后。
 * 验证：
 *  1. 新建两个线程，使用同一个futuretask。
 *  2. 在 call() 方法中，添加睡眠两秒的方法，查看main的执行效率。
 * 结果：
 *  1. t1	---
 *     futureTask.get() = 1024
 *     futureTask.get() = 1024
 *     只运行了一个线程的call方法。
 *  2. （1）放在方法中间，main程序一直等到子线程执行完才往下执行。
 *     （2）放在最后，先输出main里面的语句，后输出子线程语句。
 *
 * 结论：
 *   1. futuretask自带缓存。当运行第二个线程的时候，发现第一个线程已经运行过该futuretask对象了，
 *      便会在缓存中，直接获取返回值。
 *   2. futuretask作用，当某个线程执行时间过长的时候，main程序并不会等待该线程执行完成，而是等
 *      该线程执行完之后，通知主线程，返回最后执行结果，因此需要放到语句最后面。
 *
 * @date 2021/9/3
 * @time 20:00
 */
public class FutureTaskDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        /*FutureTask<Integer> futureTask1 = new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName() + "\t" + "---");

            return 1024;
        });*/
        /*FutureTask<Integer> futureTask2 = new FutureTask<>(() -> {
            System.out.println(Thread.currentThread().getName() + "\t" + "---");

            return 1025;
        });*/
        FutureTask<Integer> futureTask3 = new FutureTask<>(() -> {
            TimeUnit.SECONDS.sleep(2);
            System.out.println(Thread.currentThread().getName() + "\t" + "---");
            return 1024;
        });

//        Thread t1 = new Thread(futureTask1, "t1");
//        Thread t2 = new Thread(futureTask1, "t2");
//        Thread t2 = new Thread(futureTask2, "t2");
        Thread t3 = new Thread(futureTask3, "t3");

//        t1.start();
//        t2.start();
        t3.start();

//        System.out.println(Thread.currentThread().getName()+"\t"+"---");
        System.out.println("futureTask.get() = " + futureTask3.get());

        System.out.println(Thread.currentThread().getName()+"\t"+"---");

//        System.out.println("futureTask.get() = " + futureTask1.get());
//        System.out.println("futureTask.get() = " + futureTask1.get());
//        System.out.println("futureTask.get() = " + futureTask2.get());
    }
}
